iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
自我挑戰組

從零開始學Web Framework : React篇系列 第 25

Day_25: 圖片在限定範圍內隨機跳動

  • 分享至 

  • xImage
  •  

1.code

import React, { useState, useEffect } from 'react';
import styles from './ImageBounce.module.css';
import Image from 'next/image';

function ImageBounce() {
  const [positionX, setPositionX] = useState(0); //水平初始位置
  const [positionY, setPositionY] = useState(0); //垂直初始位置
  const [velocityX, setVelocityX] = useState(2); //水平初始速度
  const [velocityY, setVelocityY] = useState(2); //垂直初始速度

  const containerWidth = 300; //容器寬度
  const containerHeight = 300; //容器高度

  useEffect(() => {
    const updatePosition = () => {
      const newPosX = positionX + velocityX;
      const newPosY = positionY + velocityY;

      //邊界檢測,碰到時會隨機反彈
      if (newPosX < 0 || newPosX + 150 > containerWidth) {
        setVelocityX(-Math.random() * 2 + 1); //隨機水平速度
      }
      if (newPosY < 0 || newPosY + 150 > containerHeight) {
        setVelocityY(-Math.random() * 2 + 1); //隨機垂直速度
      }

      setPositionX(newPosX);
      setPositionY(newPosY);
    };

    const animationFrame = requestAnimationFrame(() => {
      updatePosition();
    });

    return () => {
      cancelAnimationFrame(animationFrame);
    };
  }, [positionX, positionY, velocityX, velocityY]);

  return (
    <div className={styles.container}>
      <div
        className={`${styles.image} ${styles['bouncing-image']}`} 
        style={{ left: `${positionX}px`, top: `${positionY}px` }}
      >
        <Image src="/S__2990088_0.jpg" width={150} height={150} alt="Bouncing Image" />
      </div>
    </div>
  );
}

export default ImageBounce;
.container {
    position: relative;
    width: 300px;
    height: 300px;
    overflow: hidden;
    border: 1px solid #ccc;
  }
  
  .image {
    position: absolute;
    transition: left 0.1s, top 0.1s;
  }
  
  .bouncing-image {
    max-width: 100%;
    height: auto;
    display: block;
  }

2.實作


上一篇
Day24: 圖片閃爍效果
下一篇
Day_26: 圖片移動由鍵盤操控
系列文
從零開始學Web Framework : React篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言